//
// Created by 86138 on 2025/6/7.
//

#include "CircularLinkList.h"
#include <iostream>

using namespace std;
namespace sweetcookie {

    void InitList(CircularLinkList &L) {
        L = (CircularLinkList) malloc(sizeof (LNode));
        if (!L) exit(OVERFLOW);
        L->next = L;
    }

    void ClearList(CircularLinkList &L) {
        LNode *p, *q;
        L = L->next; // 尾结点L必须先重新指向头结点，否则while条件判断就会导致原尾结点漏掉删除
        p = L->next;
        while (p != L) {
            q = p->next;
            free(p);
            p = q;
        }
        L->next = L;
    }

    void DestroyList(CircularLinkList &L) {
        // 必须调用ClearList方法，否则不正确
        ClearList(L);
        free(L);
        L = nullptr; // 避免野指针
    }

    Status ListEmpty(CircularLinkList L) {
        if (L->next == L) return true;
        return false;
    }

    int ListLength(CircularLinkList L) {
        int length = 0;
        LNode *p;
        p = L->next->next;
        while (p != L->next) {
            length++;
            p = p->next;
        }
        return length;
    }

    Status ListInsert(CircularLinkList &L, int i, ElemType e) {
        if (i <= 0 || i > ListLength(L) + 1) return ERROR;
        LNode *p = L->next;
        int j = 0;
        while (j < i - 1) {
            p = p->next;
            j++;
        }
        LNode *s = (LNode *) malloc(sizeof(LNode));
        if (!s) exit(OVERFLOW);
        s->data = e;
        s->next = p->next;
        p->next = s;
        if (p == L) { // 插入在表尾
            L = s;
        }

        return OK;
    }

    Status ListDelete(CircularLinkList &L, int i, ElemType &e) {
        if (i <= 0 || i > ListLength(L)) return ERROR;

        int j = 0;
        LNode *p = L->next;
        while (j < i - 1) {
            p = p->next;
            j++;
        }
        LNode *q = p->next;
        e = q->data;
        p->next = q->next;
        free(q);
        if (q == L) {
            L = p;
        }
        return OK;
    }

    void ListTraverse(CircularLinkList L) {
        LNode *p = L->next->next; // p指向首元结点
        while (p!= L->next) { // p不指向头结点
            cout << p->data << " ";
            p = p->next;
        }
        cout << endl;
    }

    void ListMerge(CircularLinkList &La, CircularLinkList &Lb) {
        LNode *head = La->next;
        La->next = Lb->next->next;

        LNode *p = Lb->next;
        free(p); // 或者直接free(Lb->next)

        Lb->next = head;
        La = Lb;
        Lb = nullptr; // 不能free(Lb)或者free(La)，没有内存泄漏
    }
}

//using namespace sweetcookie;
//
//int main() {
//    system("chcp 65001");
//    CircularLinkList La, Lb;
//    InitList(La);
//    InitList(Lb);
//    ListInsert(La, 1, 1);
//    ListInsert(La, 2, 2);
//    ListInsert(La, 3, 3);
//    ListInsert(Lb, 1, 4);
//    ListInsert(Lb, 2, 5);
//    ListMerge(La, Lb);
//    ListTraverse(La);
//    return 0;
//}